perm filename XWRD1.SAI[PUZ,HPM] blob
sn#153528 filedate 1975-04-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "XWORD"
C00003 00003 BEGIN
C00005 00004 INIWRD(DICSIZ,WORDS[0]) TREE←0
C00006 00005 IF TRUE THEN comment display the dictionary
C00008 00006 FOR L←1 STEP 1 UNTIL SIZE DO FOR M←1 STEP 1 UNTIL SIZE DO XWRD[L,M]←"A"
C00009 00007 IF I MOD 2=0 THEN
C00013 00008 ELSE
C00016 00009 IF ¬FLUSH THEN
C00018 ENDMK
C⊗;
BEGIN "XWORD"
REQUIRE "DICWRD.SAI[PUZ,HPM]" SOURCE_FILE;
REQUIRE "DDSUB.SAI[GRA,HPM]" SOURCE_FILE;
INTEGER SIZE,I,J,K,L,M,N,O,CHN,DICSIZ,DICSTP,CNT,BRK,EOF,FLG;
OUTSTR("PUZZLE SIZE:"); SIZE←CVD(INCHWL);
OUTSTR("NO OF DICTIONARY WORDS:"); DICSIZ←CVD(INCHWL);
OUTSTR("DICTIONARY STEP SIZE:"); DICSTP←CVD(INCHWL);
OUTSTR("CHANNEL "&CVOS(CHN←GDDCHN(-1))&'15&'12);
DDINIT;
SCREEN(-1,-1,SIZE+1,SIZE+1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
BEGIN
LINE(0,K,SIZE,K);
LINE(K,0,K,SIZE);
END;
DPYUP(CHN);
SHOW(CHN);
BEGIN
INTEGER ARRAY XWRD[1:SIZE,1:SIZE];
INTEGER ARRAY WORDS[0:DICSIZ];
INTEGER TREE; STRING WRD;
STRING PROCEDURE BUMP(STRING PLUMB);
BEGIN
BOOLEAN WINNAGE;
comment this bumps;
WINNAGE←FALSE;
WHILE LENGTH(PLUMB)>0 ∧ ¬WINNAGE DO
IF PLUMB[∞ TO ∞]="Z" THEN PLUMB←PLUMB[1 TO ∞-1]
ELSE
BEGIN
PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
IF FINWRD(TREE,PLUMB,SIZE)≠0 THEN WINNAGE←TRUE;
END;
IF WINNAGE THEN
BEGIN
comment this builds;
WHILE LENGTH(PLUMB)<SIZE DO
BEGIN
PLUMB←PLUMB&"A";
WHILE FINWRD(TREE,PLUMB,SIZE)=0 DO
PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
END;
END;
RETURN(PLUMB);
END;
INIWRD(DICSIZ,WORDS[0]); TREE←0;
OPEN(1,"DSK",0,2,0,30,BRK,EOF);
LOOKUP(1,"DICT",FLG);
SETBREAK(1,'12," "&'15&'13&'14&"'","INS");
DO FOR L←1 STEP 1 UNTIL DICSTP DO
DO WRD←INPUT(1,1) UNTIL LENGTH(WRD)=SIZE ∨ EOF
UNTIL EOF ∨ INSWRD(TREE,WRD)=0;
CLOSE(1);
IF TRUE THEN comment display the dictionary;
BEGIN
STRING PLUMB;
PLUMB←"";
DO
BEGIN
BOOLEAN WINNAGE;
comment this builds;
WHILE LENGTH(PLUMB)<SIZE DO
BEGIN
PLUMB←PLUMB&"A";
WHILE FINWRD(TREE,PLUMB,SIZE)=0 DO
PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
END;
OUTSTR(PLUMB&" ");
comment this bumps;
WINNAGE←FALSE;
WHILE LENGTH(PLUMB)>0 ∧ ¬WINNAGE DO
IF PLUMB[∞ TO ∞]="Z" THEN PLUMB←PLUMB[1 TO ∞-1]
ELSE
BEGIN
PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
IF FINWRD(TREE,PLUMB,SIZE)≠0 THEN WINNAGE←TRUE;
END;
END
UNTIL LENGTH(PLUMB)=0;
END;
FOR L←1 STEP 1 UNTIL SIZE DO FOR M←1 STEP 1 UNTIL SIZE DO XWRD[L,M]←"A";
I←1;
WHILE I≤2*SIZE∧I>0 DO
BEGIN
STRING KS;
BOOLEAN FLUSH;
J←(I+1)%2;
IF I MOD 2=0 THEN
BEGIN
STRING PARTIAL;
KS←"";
FOR L←1 STEP 1 UNTIL SIZE DO KS←KS&XWRD[J,L];
DO
BEGIN
KS←BUMP(KS);
IF LENGTH(KS)≠0 THEN
BEGIN
FOR L←J+1 STEP 1 UNTIL SIZE DO XWRD[J,L]←KS[L TO L];
L←J+1; FLUSH←FALSE;
WHILE L≤SIZE ∧ ¬FLUSH DO
BEGIN
PARTIAL←"";
FOR M←1 STEP 1 UNTIL J DO PARTIAL←PARTIAL&XWRD[L,M];
FLUSH←(FINWRD(TREE,PARTIAL,SIZE)=0);
L←L+1;
END;
END;
END UNTIL LENGTH(KS)=0 ∨ ¬FLUSH;
IF FLUSH THEN I←I-1 ELSE
BEGIN
I←I+1;
IF J<SIZE THEN FOR L←J+1 STEP 1 UNTIL SIZE DO XWRD[L,J+1]←"A";
END;
END
ELSE
BEGIN
STRING PARTIAL;
KS←"";
FOR L←1 STEP 1 UNTIL SIZE DO KS←KS&XWRD[L,J];
DO
BEGIN
KS←BUMP(KS);
IF LENGTH(KS)≠0 THEN
BEGIN
FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J]←KS[L TO L];
L←J+1; FLUSH←FALSE;
WHILE L≤SIZE ∧ ¬FLUSH DO
BEGIN
PARTIAL←"";
FOR M←1 STEP 1 UNTIL J DO PARTIAL←PARTIAL&XWRD[L,M];
FLUSH←(FINWRD(TREE,PARTIAL,SIZE)=0);
L←L+1;
END;
END;
END UNTIL LENGTH(KS)=0 ∨ ¬FLUSH;
IF FLUSH THEN I←I-1 ELSE
BEGIN
I←I+1;
IF J<SIZE THEN FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J+1]←"A";
END;
END;
IF ¬FLUSH THEN
BEGIN
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
BEGIN
LINE(0,K,SIZE,K);
LINE(K,0,K,SIZE);
END;
FOR K←1 STEP 1 UNTIL SIZE DO
FOR L←1 STEP 1 UNTIL (I+1)%2 DO
BEGIN
TXTPOS(K-.7,SIZE-L+.3,.5,.5);
TEXT(XWRD[K,L]);
END;
FOR K←1 STEP 1 UNTIL I%2 DO
FOR L←1 STEP 1 UNTIL SIZE DO
BEGIN
TXTPOS(K-.7,SIZE-L+.3,.5,.5);
TEXT(XWRD[K,L]);
END;
DPYUP(CHN);
SHOW(CHN);
END;
END;
END;
END;